package simulaco.web.action;

import gminet.infra.business.BusinessException;
import gminet.infra.db.TransactionException;
import gminet.infra.web.WebException;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

import simulaco.business.ConcursoMateriaBusiness;
import simulaco.business.MateriaBusiness;
import simulaco.business.SituacaoBusiness;
import simulaco.dto.Acao;
import simulaco.dto.Concurso;
import simulaco.dto.ConcursoMateria;
import simulaco.dto.Materia;
import simulaco.dto.Situacao;
import simulaco.dto.UsuarioPerfil;

@ManagedBean(name = "adminConcursoMateriaAction")
@SessionScoped
public class AdminConcursoMateriaAction extends WebAction {

    private static final long serialVersionUID = 8310752058768414921L;

    private Concurso concurso;

    private ConcursoMateria concursoMateria;

    private List<ConcursoMateria> concursoMaterias;

    public AdminConcursoMateriaAction() {

        super();
    }

    public String listar() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        String pageReturn = "";
        try {
            setConcursoMaterias(ConcursoMateriaBusiness.findByConcurso(getConcurso().getCodigo()));
            pageReturn = "adminListaConcursoMaterias";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public String prepararInclusao() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        setAcaoIncluir(true);
        this.concursoMateria = null;
        getConcursoMateria().setConcurso(getConcurso());
        getConcursoMateria().setSituacao(Situacao.HABILITADO);
        return "adminMantemConcursoMateriaFromLista";
    }

    public String incluir() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        String pageReturn = "";
        try {
            ConcursoMateriaBusiness.insert(getConcursoMateria());
            pageReturn = listar();
        } catch (BusinessException be) {
            addBusinessException("frmMateria", be);
            pageReturn = "adminMantemConcursoMateria";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public void executarAcao() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        if (getAcao().equals(Acao.ATIVAR) || getAcao().equals(Acao.DESATIVAR)) {
            alterarSituacao();
        } else if (getAcao().equals(Acao.EXCLUIR)) {
            excluir();
        }
    }

    public void alterarSituacao() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        try {
            if (getAcao().equals(Acao.ATIVAR)) {
                getConcursoMateria().setSituacao(Situacao.HABILITADO);
            } else if (getAcao().equals(Acao.DESATIVAR)) {
                getConcursoMateria().setSituacao(Situacao.DESABILITADO);
            }
            ConcursoMateriaBusiness.updateStatus(getConcursoMateria());
            // ATUALIZA LISTA
            setConcursoMaterias(ConcursoMateriaBusiness.findByConcurso(getConcurso().getCodigo()));
            // GRAVA MENSAGEM PARA O USUARIO
            String msgAcao = (getAcao().equals(Acao.ATIVAR) ? "habilitada" : "desabilitada");
            addMessage("frmListaMaterias", "Materia " + msgAcao + " com sucesso!");
        } catch (BusinessException be) {
            addBusinessException("frmListaMaterias", be);
        } catch (TransactionException te) {
            throw new WebException(te);
        }
    }

    private void excluir() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        try {
            ConcursoMateriaBusiness.delete(getConcursoMateria());
            // ATUALIZA LISTA
            setConcursoMaterias(ConcursoMateriaBusiness.findByConcurso(getConcurso().getCodigo()));
            // GRAVA MENSAGEM PARA O USUARIO
            addMessage("frmListaMaterias", "Materia excluida com sucesso!");
        } catch (BusinessException be) {
            addBusinessException("frmListaMaterias", be);
        } catch (TransactionException te) {
            throw new WebException(te);
        }
    }

    public List<SelectItem> getMateriaItems() throws WebException {

        List<SelectItem> materiaItems = new ArrayList<SelectItem>();
        List<Materia> listaMateria;
        try {
            listaMateria = MateriaBusiness.findActives();
            for (Materia materia : listaMateria) {
                materiaItems.add(new SelectItem(new Integer(materia.getCodigo()), materia.getNome()));
            }
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return materiaItems;
    }

    public List<SelectItem> getSituacaoItems() throws WebException {

        List<SelectItem> situacaoItems = new ArrayList<SelectItem>();
        List<Situacao> listaSituacao = SituacaoBusiness.findAll();
        for (Situacao situacao : listaSituacao) {
            situacaoItems.add(new SelectItem(new Integer(situacao.getCodigo()), situacao.getNome()));
        }
        return situacaoItems;
    }

    public Concurso getConcurso() {
        return concurso;
    }

    public void setConcurso(Concurso concurso) {
        this.concurso = concurso;
    }

    public ConcursoMateria getConcursoMateria() {
        if (this.concursoMateria == null) {
            this.concursoMateria = new ConcursoMateria();
        }
        return concursoMateria;
    }

    public void setConcursoMateria(ConcursoMateria concursoMateria) {
        this.concursoMateria = concursoMateria;
    }

    public List<ConcursoMateria> getConcursoMaterias() {
        return concursoMaterias;
    }

    public void setConcursoMaterias(List<ConcursoMateria> concursoMaterias) {
        this.concursoMaterias = concursoMaterias;
    }

}
